iT邦幫忙

2023 iThome 鐵人賽

DAY 28
1
Modern Web

你應該要知道的CSS技巧:發掘被忽略但實用的屬性系列 第 28

【Day28】改變CSS的遊戲規則 - 自定義屬性CSS @property

  • 分享至 

  • xImage
  •  

CSS @property

CSS @property支援度:Can I Use)

CSS @property允許定義自己的CSS屬性,以在CSS變換函數中使用,並允許進行屬性類型檢查、設定默認值以及定義該自定義屬性是否可以被繼承。

定義一個新的property時,需要有以下幾個屬性:

屬性 描述
syntax 定義屬性的語法規則(類型),必需值。可接受的值如以下:length、number、percentage、length-percentage、color、image、url、integer、angle、time、resolution、transform-list、transform-function、custom-ident (a custom identifier string)
inherits 是否允許繼承,必需值。
initial-value 初始值

一般css屬性:

:root{
    --primary-color:black;
}

.container{
  width:100px;
  height:100px;
  background-color:var(--primary-color);
}

自定義屬性的情況:

@property --primary-color {
  syntax: '<color>';
  inherits: false;
  initial-value: #000;
}
.container{
  width:100px;
  height:100px;
  background-color:var(--primary-color);
}

來看一下自定義屬性帶來什麼方便的地方呢?

像是CSS不支援background屬性直接有transition效果,那像是漸層就會沒有transition效果,如以下:

:root{
  --gradientColor1:#000;
  --gradientColor2:#fff; 
}

.container{
  width:100px;
  height:100px;
  background: linear-gradient(45deg, var(--gradientColor1), var(--gradientColor2));
  transition: 1s background;
  &:hover{
    --gradientColor1:red;
    --gradientColor2:pink; 
  }
}

利用自定義屬性,如以下:

@property --gradientColor1 {
  syntax: '<color>';
  inherits: false;
  initial-value: #000;
}
@property --gradientColor2 {
  syntax: '<color>';
  inherits: false;
  initial-value: #fff;
}
.container{
  width:100px;
  height:100px;
  background: linear-gradient(45deg, var(--gradientColor1), var(--gradientColor2));
  transition: 1s --gradientColor1,1s --gradientColor2;
  &:hover{
    --gradientColor1:red;
    --gradientColor2:pink; 
  }
}

原因是原本transition不支援background屬性,而我們善用自定義屬性,transition設成自定義屬性的過渡效果,而自定義屬性在一開始就設定為可以有transition屬性的color類別,所以最後呈現就是很smooth轉換的漸層效果啦!

codepen範例

IT15-Day28-CSS @property

參考來源


上一篇
【Day27】 用CSS畫出各種形狀 - <basic-shape>
下一篇
【Day29】讓網頁在不同螢幕尺寸上都完美呈現! - CSS Viewport Units
系列文
你應該要知道的CSS技巧:發掘被忽略但實用的屬性30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言